МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИНАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІНСТИТУТ КОМП’ЮТЕРНОЇ ТЕХНІКИ АВТОМАТИКИ ТА МЕТРОЛОГІЇ
Кафедра ЕОМ
ЗВІТ ЛАБОРАТОРНОЇ РОБОТИ №2
З ПРЕДМЕТУ: «Програмування. Частина III.
Структури даних та алгоритми»
ТЕМА: «Перетворення типів даних»
ВИБІР ВАРІАНТУ:
Завдання 1
х0
wchar_t
х1
unsigned int
х2
char
х3
char
х4
unsigned long int
х5
signed long int
х6
unsigned short int
х7
long double
х8
signed int
х9
unsigned short int
х10
float
х11
unsigned long int
Завдання 2
const int x_4= 0x0717;
int x=x_4;
const double y_4=-7.17e-1;
double y=y_4;
v2
w0
v7
w3
Львів – 2011
Мета роботи.
Дослідження методів та засобів явного та неявного перетворення типів даних.
Постановка задачі.
Завдання 1:
Визначити, які неявні перетворення типів будуть відбуватись при обчисленнях. З’ясувати, чи відбудуться втрати значимості даних. Хід міркувань підтвердити програмними результатами. В звіти пояснити кожне перетворення і метод, яким воно здійснено.
wchar_t x0=0;
unsigned int x1=17;
char x2=2;
char x3=3;
unsigned long int x4=4;
signed long int x5=5;
unsigned short int x6=6;
long double x7=7;
signed int x8=8;
unsigned short int x9=9;
float x10=10;
unsigned long int x11=11;
/* 1 */ x1 = x1 – 0xFFFFFFFA;
/* 2 */ x3 = ’a’ + x0 – x2;
/* 3 */ x7 = x4 + x5 + x6 * 0.1;
/* 4 */ x8 = x9 + x10 – x11*10;
Завдання 2
Визначити, які явні і неявні перетворення типів будуть відбуватись. Результати обчислень підтвердити програмними результатами. В звіти пояснити кожне перетворення і кожний отриманий результат.
const int x_4= 0x0717;
const double y_4=-7.17e-1;
int x=x_4;
double y=y_4;
char v2=*reinterpret_cast<char*> (&x) +1; printf("%d %x %c \n", v2,v2,v2);
char v7=*reinterpret_cast<char*> (&x); printf("%d %x %c \n", *v7+1,*v7+2, *v7+3);
char w0 =*(reinterpret_cast<char*>(&y)+2)+12; printf("%x %u %d \n", w0,w0,w0);
short w3=*reinterpret_cast<short*>(&y) + 1; printf("%x %u %d \n", w3,w3,w3);
Алгоритм розв’язання задачі.
За індивідуальним завданням я розробила алгоритм розв’язання задачі.
Цей алгоритм був реалізований у програмі, в якій спочатку підключаються потрібні для виконання програми бібліотеки, а саме stdio.h, conio.h, iostream. Після цього ініціалізовані усі потрібні змінні. Для кожної змінної властивий інший тип, який обирається згідно індивідуального варіанту. Після цього виконуються операції над змінними та виведення значень:
/* 1 */ x1 = x1 - 0xFFFFFFFA;
/* 2 */ x3 = 'a' + x0 - x2;
/* 3 */ x7 = x4 + x5 + x6 * 0.1;
/* 4 */ x8 = x9 + x10 - x11*10;
cout << "x1= " <<x1<< endl
<< "x3= " <<x3<< endl
<< "x7= " <<x7<< endl
<< "x8= " <<x8<< endl <<endl;
Наступним у програмі є задання нових зміннихта виконання над ними дій, після чого задане виведення отриманих значень:
int x=x_4;
double y=y_4;
char v2=*reinterpret_cast<char*> (&x) +1; printf("%d %x %c \n", v2,v2,v2);
char *v7=reinterpret_cast<char*> (&x); printf("%d %x %c \n", *v7+1,*v7+2, *v7+3);
char w0 =*(reinterpret_cast<char*>(&y)+2)+12; printf("%x %u %d \n", w0,w0,w0);
short w3=*reinterpret_cast<short*>(&y) + 1; printf("%x %u %d \n", w3,w3,w3);
Система тестів
Завдання 1.
Розглянемо , як відбуваються перетворення в першому виразі:
x1 = x1 – 0xFFFFFFFA
unsigned int = unsigned int - int
0xFFFFFFFA
ВПК: FA FF FF FF
Літерал 0xFFFFFFFA приводиться до unsigned int.
Метод: збереження бітів, старший біт втрачає функцію знакового біта.
ВПК: FA FF FF FF
FF FF FF FA =
−6
10
unsigned int x1 =
17
10
ВПК: 11 00 00 00
Залишається unsigned int.
x1 = 00 00 00 11 =
17
10
Результат: 17 – (-6) =
23
10
(unsigned int)
ВПК: 17 00 00 00
Присвоюється без змін, бо обидва операнди типу unsigned in...